package com.company;

import com.company.proxy.type2.ProxyByDynamic;
import com.company.proxy.type2.RealSubject;
import com.company.proxy.type2.Subject;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * Java动态代理模式测试代码
 */
public class TestForDynamic {

    public static void main(String[] args) {
        //直接调用真实对象的方法
        Subject realObj = new RealSubject();
        realObj.method1();
        System.out.println("----------");
        realObj.method2();

        System.out.println("=========================");

        //调用动态代理对象的方法
        //创建一个实例对象，即被代理的对象
        Subject demoSubject = new RealSubject();

        //创建一个与代理对象相关联的InvocationHandler实例对象
        InvocationHandler handler = new ProxyByDynamic<>(demoSubject);

        //创建一个代理对象proxy来代理demoSubject，代理对象的每个执行方法都会替换执行InvocationHandler中的invoke方法
        Subject proxy = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(), new Class<?>[]{Subject.class}, handler);

        //代理方式执行相关方法
        proxy.method1();
        System.out.println("----------");
        proxy.method2();
    }
}
